5.

Давайте проанализируем данные опроса 4361 женщин из Ботсваны:

botswana.tsv О каждой из них мы знаем:

сколько детей она родила (признак ceb) возраст (age) длительность получения образования (educ) религиозная принадлежность (religion) идеальное, по её мнению, количество детей в семье (idlnchld) была ли она когда-нибудь замужем (evermarr) возраст первого замужества (agefm) длительность получения образования мужем (heduc) знает ли она о методах контрацепции (knowmeth) использует ли она методы контрацепции (usemeth) живёт ли она в городе (urban) есть ли у неё электричество, радио, телевизор и велосипед (electric, radio, tv, bicycle) Давайте научимся оценивать количество детей ceb по остальным признакам.

Загрузите данные и внимательно изучите их. Сколько разных значений принимает признак religion?

6.

Во многих признаках есть пропущенные значения. Сколько объектов из 4361 останется, если выбросить все, содержащие пропуски?

7.

В разных признаках пропуски возникают по разным причинам и должны обрабатываться по-разному.

Например, в признаке agefm пропуски стоят только там, где evermarr=0, то есть, они соответствуют женщинам, никогда не выходившим замуж. Таким образом, для этого признака NaN соответствует значению "не применимо".

В подобных случаях, когда признак x1 на части объектов в принципе не может принимать никакие значения, рекомендуется поступать так:

создать новый бинарный признак x2={1,0,x1='не применимо',иначе; заменить "не применимо" в x1 на произвольную константу c, которая среди других значений x1 не встречается. Теперь, когда мы построим регрессию на оба признака и получим модель вида y=β0+β1x1+β2x2, на тех объектах, где x1 было измерено, регрессионное уравнение примет вид y=β0+β1x, а там, где x1 было "не применимо", получится y=β0+β1c+β2. Выбор c влияет только на значение и интерпретацию β2, но не β1.

Давайте используем этот метод для обработки пропусков в agefm и heduc.

Создайте признак nevermarr, равный единице там, где в agefm пропуски. Удалите признак evermarr — в сумме с nevermarr он даёт константу, значит, в нашей матрице X будет мультиколлинеарность. Замените NaN в признаке agefm на cagefm=0. У объектов, где nevermarr = 1, замените NaN в признаке heduc на cheduc1=−1 (ноль использовать нельзя, так как он уже встречается у некоторых объектов выборки). Сколько осталось пропущенных значений в признаке heduc?

8.

Избавимся от оставшихся пропусков.

Для признаков idlnchld, heduc и usemeth проведите операцию, аналогичную предыдущей: создайте индикаторы пропусков по этим признакам (idlnchld_noans, heduc_noans, usemeth_noans), замените пропуски на нехарактерные значения (cidlnchld=−1, cheduc2=−2 (значение -1 мы уже использовали), cusemeth=−1).

Остались только пропуски в признаках knowmeth, electric, radio, tv и bicycle. Их очень мало, так что удалите объекты, на которых их значения пропущены.

Какого размера теперь наша матрица данных? Умножьте количество строк на количество всех столбцов (включая отклик ceb).

9.

Постройте регрессию количества детей ceb на все имеющиеся признаки методом smf.ols, как в разобранном до этого примере. Какой получился коэффициент детерминации R2? Округлите до трёх знаков после десятичной точки.

11.

Проверьте критерием Бройша-Пагана гомоскедастичность ошибки в построенной модели. Выполняется ли она? Если ошибка гетероскедастична, перенастройте модель, сделав поправку Уайта типа HC1.

12.

Удалите из модели незначимые признаки religion, radio и tv. Проверьте гомоскедастичность ошибки, при необходимости сделайте поправку Уайта.

Не произошло ли значимого ухудшения модели после удаления этой группы признаков? Проверьте с помощью критерия Фишера. Чему равен его достигаемый уровень значимости? Округлите до четырёх цифр после десятичной точки.

Если достигаемый уровень значимости получился маленький, верните все удалённые признаки; если он достаточно велик, оставьте модель без религии, тв и радио.

13.

Признак usemeth_noans значим по критерию Стьюдента, то есть, при его удалении модель значимо ухудшится. Но вообще-то отдельно его удалять нельзя: из-за того, что мы перекодировали пропуски в usemeth произвольно выбранным значением cusemeth=−1, удалять usemeth_noans и usemeth можно только вместе.

Удалите из текущей модели usemeth_noans и usemeth. Проверьте критерием Фишера гипотезу о том, что качество модели не ухудшилось. Введите номер первой значащей цифры в достигаемом уровне значимости (например, если вы получили 5.5×10−8, нужно ввести 8).

Если достигаемый уровень значимости получился маленький, верните удалённые признаки; если он достаточно велик, оставьте модель без usemeth и usemeth_noans.


In [1]:
import statsmodels
import scipy as sc
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.stats.api as sms
from statsmodels.graphics.regressionplots import plot_leverage_resid2
import matplotlib.pyplot as plt

In [2]:
%pylab inline


Populating the interactive namespace from numpy and matplotlib

In [49]:
raw = pd.read_csv("botswana.tsv", sep="\t", index_col=False) 
raw.head()


Out[49]:
ceb age educ religion idlnchld knowmeth usemeth evermarr agefm heduc urban electric radio tv bicycle
0 0 18 10 catholic 4.0 1.0 1.0 0 NaN NaN 1 1.0 1.0 1.0 1.0
1 2 43 11 protestant 2.0 1.0 1.0 1 20.0 14.0 1 1.0 1.0 1.0 1.0
2 0 49 4 spirit 4.0 1.0 0.0 1 22.0 1.0 1 1.0 1.0 0.0 0.0
3 0 24 12 other 2.0 1.0 0.0 0 NaN NaN 1 1.0 1.0 1.0 1.0
4 3 32 13 other 3.0 1.0 1.0 1 24.0 12.0 1 1.0 1.0 1.0 1.0

In [50]:
raw.religion.value_counts()


Out[50]:
spirit        1841
other         1080
protestant     993
catholic       447
Name: religion, dtype: int64

In [51]:
raw.shape


Out[51]:
(4361, 15)

In [52]:
raw.dropna().shape


Out[52]:
(1834, 15)

In [53]:
raw[raw['heduc'].isnull()].shape


Out[53]:
(2405, 15)

In [64]:
raw = pd.read_csv("botswana.tsv", sep="\t", index_col=False) 
raw['nevermarr'] = np.where(raw['agefm'].isnull(), 1, 0)
raw = raw.drop('evermarr', 1)
raw['agefm'].fillna(0, inplace=True)
raw.loc[(raw['nevermarr'] == 1) & (raw['heduc'].isnull()), 'heduc'] = -1
raw[raw['heduc'].isnull()].shape


Out[64]:
(123, 15)

In [65]:
raw.head()


Out[65]:
ceb age educ religion idlnchld knowmeth usemeth agefm heduc urban electric radio tv bicycle nevermarr
0 0 18 10 catholic 4.0 1.0 1.0 0.0 -1.0 1 1.0 1.0 1.0 1.0 1
1 2 43 11 protestant 2.0 1.0 1.0 20.0 14.0 1 1.0 1.0 1.0 1.0 0
2 0 49 4 spirit 4.0 1.0 0.0 22.0 1.0 1 1.0 1.0 0.0 0.0 0
3 0 24 12 other 2.0 1.0 0.0 0.0 -1.0 1 1.0 1.0 1.0 1.0 1
4 3 32 13 other 3.0 1.0 1.0 24.0 12.0 1 1.0 1.0 1.0 1.0 0

In [66]:
raw['idlnchld_noans'] = np.where(raw['idlnchld'].isnull(), 1, 0)
raw['idlnchld'].fillna(-1, inplace=True)

raw['heduc_noans'] = np.where(raw['heduc'].isnull(), 1, 0)
raw['heduc'].fillna(-2, inplace=True)

raw['usemeth_noans'] = np.where(raw['usemeth'].isnull(), 1, 0)
raw['usemeth'].fillna(-1, inplace=True)

raw.shape


Out[66]:
(4361, 18)

In [69]:
raw.dropna(subset=['knowmeth', 'electric', 'radio', 'tv', 'bicycle'], how='any', inplace=True)
raw.shape[0]*raw.shape[1]


Out[69]:
78264

In [71]:



Out[71]:
ceb               0
age               0
educ              0
religion          0
idlnchld          0
knowmeth          0
usemeth           0
agefm             0
heduc             0
urban             0
electric          0
radio             0
tv                0
bicycle           0
nevermarr         0
idlnchld_noans    0
heduc_noans       0
usemeth_noans     0
dtype: int64

In [76]:
m1 = smf.ols('ceb ~ age + educ + religion + idlnchld + knowmeth + usemeth +'\
                    'agefm + heduc + urban + electric + radio + tv + bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans + usemeth_noans', 
             data=raw)
fitted = m1.fit()
print fitted.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    ceb   R-squared:                       0.644
Model:                            OLS   Adj. R-squared:                  0.643
Method:                 Least Squares   F-statistic:                     412.5
Date:                Fri, 15 Jul 2016   Prob (F-statistic):               0.00
Time:                        01:21:34   Log-Likelihood:                -7732.1
No. Observations:                4348   AIC:                         1.550e+04
Df Residuals:                    4328   BIC:                         1.563e+04
Df Model:                          19                                         
Covariance Type:            nonrobust                                         
==========================================================================================
                             coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------------------
Intercept                 -1.0263      0.212     -4.835      0.000        -1.443    -0.610
religion[T.other]         -0.0830      0.083     -1.001      0.317        -0.245     0.080
religion[T.protestant]    -0.0149      0.082     -0.181      0.857        -0.176     0.146
religion[T.spirit]        -0.0191      0.077     -0.248      0.804        -0.171     0.132
age                        0.1703      0.003     51.891      0.000         0.164     0.177
educ                      -0.0724      0.007     -9.843      0.000        -0.087    -0.058
idlnchld                   0.0760      0.011      6.923      0.000         0.054     0.098
knowmeth                   0.5564      0.121      4.580      0.000         0.318     0.795
usemeth                    0.6473      0.048     13.424      0.000         0.553     0.742
agefm                     -0.0604      0.007     -9.213      0.000        -0.073    -0.048
heduc                     -0.0551      0.008     -6.838      0.000        -0.071    -0.039
urban                     -0.2137      0.047     -4.527      0.000        -0.306    -0.121
electric                  -0.2685      0.077     -3.479      0.001        -0.420    -0.117
radio                     -0.0235      0.051     -0.461      0.645        -0.123     0.076
tv                        -0.1451      0.093     -1.566      0.118        -0.327     0.037
bicycle                    0.2139      0.050      4.260      0.000         0.115     0.312
nevermarr                 -2.2393      0.148    -15.143      0.000        -2.529    -1.949
idlnchld_noans             0.6539      0.153      4.286      0.000         0.355     0.953
heduc_noans               -0.8724      0.145     -6.026      0.000        -1.156    -0.589
usemeth_noans              0.7652      0.196      3.910      0.000         0.382     1.149
==============================================================================
Omnibus:                      224.411   Durbin-Watson:                   1.887
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              859.014
Skew:                           0.003   Prob(JB):                    2.93e-187
Kurtosis:                       5.178   Cond. No.                         361.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

In [78]:
fitted.model.exog


Out[78]:
array([[ 1.,  0.,  0., ...,  0.,  0.,  0.],
       [ 1.,  0.,  1., ...,  0.,  0.,  0.],
       [ 1.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 1.,  0.,  1., ...,  0.,  0.,  0.],
       [ 1.,  0.,  0., ...,  0.,  0.,  0.],
       [ 1.,  0.,  1., ...,  0.,  0.,  0.]])

In [80]:
print 'Breusch-Pagan test: p=%f' % sms.het_breushpagan(fitted.resid, fitted.model.exog)[1]


Breusch-Pagan test: p=0.000000

In [87]:
m2 = smf.ols('ceb ~ age + educ + religion + idlnchld + knowmeth + usemeth +'\
                    'agefm + heduc + urban + electric + radio + tv + bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans + usemeth_noans', 
             data=raw)
fitted = m2.fit(cov_type='HC1')
print fitted.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    ceb   R-squared:                       0.644
Model:                            OLS   Adj. R-squared:                  0.643
Method:                 Least Squares   F-statistic:                     345.0
Date:                Fri, 15 Jul 2016   Prob (F-statistic):               0.00
Time:                        01:26:19   Log-Likelihood:                -7732.1
No. Observations:                4348   AIC:                         1.550e+04
Df Residuals:                    4328   BIC:                         1.563e+04
Df Model:                          19                                         
Covariance Type:                  HC1                                         
==========================================================================================
                             coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------------------
Intercept                 -1.0263      0.266     -3.863      0.000        -1.547    -0.506
religion[T.other]         -0.0830      0.078     -1.067      0.286        -0.235     0.069
religion[T.protestant]    -0.0149      0.078     -0.192      0.848        -0.167     0.137
religion[T.spirit]        -0.0191      0.071     -0.268      0.789        -0.159     0.121
age                        0.1703      0.004     38.627      0.000         0.162     0.179
educ                      -0.0724      0.007     -9.924      0.000        -0.087    -0.058
idlnchld                   0.0760      0.015      5.236      0.000         0.048     0.104
knowmeth                   0.5564      0.174      3.190      0.001         0.215     0.898
usemeth                    0.6473      0.052     12.478      0.000         0.546     0.749
agefm                     -0.0604      0.010     -6.174      0.000        -0.080    -0.041
heduc                     -0.0551      0.009     -6.126      0.000        -0.073    -0.037
urban                     -0.2137      0.046     -4.667      0.000        -0.303    -0.124
electric                  -0.2685      0.072     -3.732      0.000        -0.410    -0.128
radio                     -0.0235      0.053     -0.446      0.656        -0.127     0.080
tv                        -0.1451      0.082     -1.766      0.077        -0.306     0.016
bicycle                    0.2139      0.048      4.412      0.000         0.119     0.309
nevermarr                 -2.2393      0.202    -11.082      0.000        -2.635    -1.843
idlnchld_noans             0.6539      0.216      3.029      0.002         0.231     1.077
heduc_noans               -0.8724      0.191     -4.556      0.000        -1.248    -0.497
usemeth_noans              0.7652      0.213      3.590      0.000         0.347     1.183
==============================================================================
Omnibus:                      224.411   Durbin-Watson:                   1.887
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              859.014
Skew:                           0.003   Prob(JB):                    2.93e-187
Kurtosis:                       5.178   Cond. No.                         361.
==============================================================================

Warnings:
[1] Standard Errors are heteroscedasticity robust (HC1)

In [88]:
print 'Breusch-Pagan test: p=%f' % sms.het_breushpagan(fitted.resid, fitted.model.exog)[1]


Breusch-Pagan test: p=0.000000

Task 12


In [89]:
m3 = smf.ols('ceb ~ age + educ + idlnchld + knowmeth + usemeth +'\
                    'agefm + heduc + urban + electric +  bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans + usemeth_noans', 
             data=raw)
fitted = m3.fit()
print fitted.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    ceb   R-squared:                       0.644
Model:                            OLS   Adj. R-squared:                  0.643
Method:                 Least Squares   F-statistic:                     559.5
Date:                Fri, 15 Jul 2016   Prob (F-statistic):               0.00
Time:                        01:26:24   Log-Likelihood:                -7734.5
No. Observations:                4348   AIC:                         1.550e+04
Df Residuals:                    4333   BIC:                         1.559e+04
Df Model:                          14                                         
Covariance Type:            nonrobust                                         
==================================================================================
                     coef    std err          t      P>|t|      [95.0% Conf. Int.]
----------------------------------------------------------------------------------
Intercept         -1.0698      0.198     -5.393      0.000        -1.459    -0.681
age                0.1702      0.003     52.271      0.000         0.164     0.177
educ              -0.0729      0.007    -10.285      0.000        -0.087    -0.059
idlnchld           0.0770      0.011      7.042      0.000         0.056     0.098
knowmeth           0.5610      0.121      4.628      0.000         0.323     0.799
usemeth            0.6516      0.048     13.537      0.000         0.557     0.746
agefm             -0.0606      0.007     -9.240      0.000        -0.073    -0.048
heduc             -0.0573      0.008     -7.186      0.000        -0.073    -0.042
urban             -0.2190      0.047     -4.682      0.000        -0.311    -0.127
electric          -0.3207      0.070     -4.584      0.000        -0.458    -0.184
bicycle            0.2046      0.049      4.154      0.000         0.108     0.301
nevermarr         -2.2501      0.148    -15.231      0.000        -2.540    -1.961
idlnchld_noans     0.6565      0.152      4.310      0.000         0.358     0.955
heduc_noans       -0.8853      0.145     -6.122      0.000        -1.169    -0.602
usemeth_noans      0.7732      0.196      3.955      0.000         0.390     1.156
==============================================================================
Omnibus:                      224.096   Durbin-Watson:                   1.886
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              856.760
Skew:                           0.004   Prob(JB):                    9.06e-187
Kurtosis:                       5.175   Cond. No.                         345.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

In [90]:
print 'Breusch-Pagan test: p=%f' % sms.het_breushpagan(fitted.resid, fitted.model.exog)[1]


Breusch-Pagan test: p=0.000000

In [91]:
m3 = smf.ols('ceb ~ age + educ + idlnchld + knowmeth + usemeth +'\
                    'agefm + heduc + urban + electric + bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans + usemeth_noans', 
             data=raw)
fitted = m3.fit(cov_type='HC1')

In [92]:
print "F=%f, p=%f, k1=%f" % m2.fit().compare_f_test(m3.fit())


F=0.919236, p=0.467231, k1=5.000000

In [94]:
m4 = smf.ols('ceb ~ age + educ + idlnchld + knowmeth + '\
                    'agefm + heduc + urban + electric + bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans', 
             data=raw)
fitted = m4.fit(cov_type='HC1')
m3.fit().compare_f_test(m4.fit())


Out[94]:
(92.890582301098021, 3.155200948039232e-40, 2.0)

In [95]:
m3 = smf.ols('ceb ~ age + educ + idlnchld + knowmeth + usemeth +'\
                    'agefm + heduc + urban + electric + bicycle + nevermarr + idlnchld_noans +'\
                    'heduc_noans + usemeth_noans', 
             data=raw)
fitted = m3.fit(cov_type='HC1')
print fitted.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    ceb   R-squared:                       0.644
Model:                            OLS   Adj. R-squared:                  0.643
Method:                 Least Squares   F-statistic:                     463.4
Date:                Fri, 15 Jul 2016   Prob (F-statistic):               0.00
Time:                        01:30:48   Log-Likelihood:                -7734.5
No. Observations:                4348   AIC:                         1.550e+04
Df Residuals:                    4333   BIC:                         1.559e+04
Df Model:                          14                                         
Covariance Type:                  HC1                                         
==================================================================================
                     coef    std err          z      P>|z|      [95.0% Conf. Int.]
----------------------------------------------------------------------------------
Intercept         -1.0698      0.258     -4.152      0.000        -1.575    -0.565
age                0.1702      0.004     38.746      0.000         0.162     0.179
educ              -0.0729      0.007    -10.311      0.000        -0.087    -0.059
idlnchld           0.0770      0.014      5.323      0.000         0.049     0.105
knowmeth           0.5610      0.174      3.224      0.001         0.220     0.902
usemeth            0.6516      0.052     12.571      0.000         0.550     0.753
agefm             -0.0606      0.010     -6.192      0.000        -0.080    -0.041
heduc             -0.0573      0.009     -6.440      0.000        -0.075    -0.040
urban             -0.2190      0.045     -4.814      0.000        -0.308    -0.130
electric          -0.3207      0.063     -5.076      0.000        -0.445    -0.197
bicycle            0.2046      0.048      4.279      0.000         0.111     0.298
nevermarr         -2.2501      0.202    -11.158      0.000        -2.645    -1.855
idlnchld_noans     0.6565      0.216      3.043      0.002         0.234     1.079
heduc_noans       -0.8853      0.191     -4.638      0.000        -1.259    -0.511
usemeth_noans      0.7732      0.212      3.639      0.000         0.357     1.190
==============================================================================
Omnibus:                      224.096   Durbin-Watson:                   1.886
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              856.760
Skew:                           0.004   Prob(JB):                    9.06e-187
Kurtosis:                       5.175   Cond. No.                         345.
==============================================================================

Warnings:
[1] Standard Errors are heteroscedasticity robust (HC1)

In [ ]: